package com.stp.rabbitmq.util;

import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.MD5;
import com.stp.rabbitmq.entity.MessageEntity;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class FileUtils {

    public static List<MessageEntity> readFileToMessage(String filePath){
        List<MessageEntity> messageList = new ArrayList<>();
        if(StrUtil.isEmpty(filePath)) return messageList;
        // 准备分片参数信息
        // 待传输文件
        File file = new File(filePath);
        // 文件UUID，组装文件分片的唯一标识
        String uuid = UUID.fastUUID().toString();
        // 文件名
        String filename = file.getName();
        // 文件md5码
        String identifier = MD5.create().digestHex(file);
        // 默认切片大小：1M
        int chunkSize = 1024 * 1024;
        // 文件总大小
        int totalSize = (int) file.length();
        // 文件切片总数
        int totalChunks = totalSize % chunkSize == 0 ? totalSize / chunkSize : (totalSize / chunkSize + 1);
        // 文件字节数组
        byte[] fileContent = cn.hutool.core.io.FileUtil.readBytes(file);

        for (int i = 1; i <= totalChunks; i++) {
            byte[] body;
            if (i == totalChunks) {
                // 最后一块
                body = Arrays.copyOfRange(fileContent, chunkSize * (i - 1), totalSize);
            } else {
                body = Arrays.copyOfRange(fileContent, chunkSize * (i - 1), chunkSize * i);
            }

            // 当前是第几片（切片）
            int chunkNumber = i;

            // 当前切片大小
            long currentChunkSize = body.length;

            // 组装发送数据
            MessageEntity message = new MessageEntity();
            message.setBody(body);
            message.setFilename(filename);
            message.setIdentifier(identifier);
            message.setUuid(uuid);
            message.setChunkNumber(chunkNumber);
            message.setChunkSize(chunkSize);
            message.setCurrentChunkSize(currentChunkSize);
            message.setTotalChunks(totalChunks);
            message.setTotalSize(totalSize);
            messageList.add(message);
        }

        return messageList;
    }
    public static List<MessageEntity> fileToMessage(File file){
        List<MessageEntity> messageList = new ArrayList<>();
        if(Objects.isNull(file)) return messageList;
        // 准备分片参数信息
        // 待传输文件
        // 文件UUID，组装文件分片的唯一标识
        String uuid = UUID.fastUUID().toString();
        // 文件名
        String filename = file.getName();
        // 文件md5码
        String identifier = MD5.create().digestHex(file);
        // 默认切片大小：1M
        int chunkSize = 1024 * 1024;
        // 文件总大小
        int totalSize = (int) file.length();
        // 文件切片总数
        int totalChunks = totalSize % chunkSize == 0 ? totalSize / chunkSize : (totalSize / chunkSize + 1);
        // 文件字节数组
        byte[] fileContent = cn.hutool.core.io.FileUtil.readBytes(file);

        for (int i = 1; i <= totalChunks; i++) {
            byte[] body;
            if (i == totalChunks) {
                // 最后一块
                body = Arrays.copyOfRange(fileContent, chunkSize * (i - 1), totalSize);
            } else {
                body = Arrays.copyOfRange(fileContent, chunkSize * (i - 1), chunkSize * i);
            }

            // 当前是第几片（切片）
            int chunkNumber = i;

            // 当前切片大小
            long currentChunkSize = body.length;

            // 组装发送数据
            MessageEntity message = new MessageEntity();
            message.setBody(body);
            message.setFilename(filename);
            message.setIdentifier(identifier);
            message.setUuid(uuid);
            message.setChunkNumber(chunkNumber);
            message.setChunkSize(chunkSize);
            message.setCurrentChunkSize(currentChunkSize);
            message.setTotalChunks(totalChunks);
            message.setTotalSize(totalSize);
            messageList.add(message);
        }

        return messageList;
    }
}
